package org.abc.fund.service.user;

import org.abc.fund.entity.user.User;
import org.abc.fund.repository.user.UserRepository;
import org.abc.fund.service.user.request.create_user.CreateUserRequest;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class UserService {
  /** 用户仓库，用于执行与用户相关的数据库操作 */
  private final UserRepository userRepository;

  /**
   * 构造函数，初始化UserService
   *
   * @param userRepository 用户仓库，不可为空
   */
  public UserService(UserRepository userRepository) {
    this.userRepository = userRepository;
  }

  /**
   * 创建新用户的方法 此方法首先检查用户名和邮箱是否已被占用，然后加密密码并保存新用户到数据库 使用事务注解确保数据一致性，即在创建用户过程中发生错误时回滚更改
   *
   * @param request 包含用户信息的创建用户请求
   * @return 保存到数据库的新用户对象
   * @throws IllegalArgumentException 如果用户名或邮箱已被占用
   */
  @Transactional
  public User createUser(CreateUserRequest request) {
    // 检查用户名是否已被占用
    if (userRepository.existsByUsername(request.getUsername())) {
      throw new IllegalArgumentException("错误：用户名已被占用！");
    }

    // 检查邮箱是否已被占用
    if (userRepository.existsByEmail(request.getEmail())) {
      throw new IllegalArgumentException("错误：邮箱已被占用！");
    }

    // 创建新的用户对象
    User user = new User();
    user.setUsername(request.getUsername());
    // 存储加密后的密码
    user.setPassword(request.getPassword());
    user.setEmail(request.getEmail());
    user.setRealName(request.getRealName());
    user.setRoles(request.getRoles());
    user.setAge(request.getAge());
    user.setGender(request.getGender());

    // 保存新用户到数据库并返回
    return userRepository.save(user);
  }

  @Transactional(readOnly = true)
  public List<User> getAllUsers() {
    return userRepository.findAll();
  }
}
